package ejbs;

import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;

import model.Kunden;
import model.Reservierung;
import model.Zimmer;

@Stateful
public class TransactionsBean {

	
	@PersistenceContext(unitName ="seseunit")
	private EntityManager em;
	
	private String err;
	
	
	 public boolean isZimmerNameExist(String name){
		 boolean _return = false;
	    	String query = "SELECT Z FROM Zimmer Z WHERE Z.name = :name";	
	    	Query q = em.createQuery(query);
			q.setParameter("name", name);
			
			try{
				@SuppressWarnings("unchecked")
				List<Zimmer> zimmers = q.getResultList();
				if(zimmers.size() > 0){
					_return = true;
					err ="The Name already exists!";
				}else{
					
				}
			}catch(Exception e){
				err = "Exception: isZimmerNameExist()--> "+ e.getMessage(); 
			}
			
			return _return;
	 }
	 
	 
	public boolean saveNewZimmer( Zimmer zimmer){
		try{
			em.persist(zimmer);
			return true;
		}catch(Exception e){
			err = "Exception: " + e.getMessage();
			return false;
		}
	}

	// 11.12.2011, new Guest will be saved in the Database
	public boolean saveNewKunden( Kunden kunde){
		try{
			em.persist(kunde);
			return true;
		}catch(Exception e){
			err = "Exception: " + e.getMessage();
			return false;
		}
	}
	
	@SuppressWarnings("unchecked")
	public Vector<Zimmer> searchZimmern(String zimmerName){
		
		Vector<Zimmer> zimmern = new Vector<Zimmer>();
		String query = "SELECT Z FROM Zimmer Z WHERE Z.name LIKE :name";
		
		Query q = em.createQuery(query);
	
		q.setParameter("name","%"+ zimmerName+"%");
		zimmern = (Vector<Zimmer>) q.getResultList(); 
		
		
	
		return zimmern;
	}
	
	@SuppressWarnings("unchecked")
	public List<Zimmer> loadAllZimmern(){
		
		List<Zimmer> zimmern = new ArrayList<Zimmer>();
		String query = "SELECT Z FROM Zimmer Z ";
		
		Query q = em.createQuery(query);
	
		
		zimmern = q.getResultList(); 
		
		
	
		return zimmern;
	}
	@SuppressWarnings("unchecked")
	public List<Kunden> loadAllKunden(){
		
		List<Kunden> kunden = new ArrayList<Kunden>();
		String query = "SELECT K FROM Kunden K ";
		
		Query q = em.createQuery(query);
	
		
		kunden = q.getResultList(); 
		
		
	
		return kunden;
	}
	
	@SuppressWarnings("unchecked")
	public Vector<Kunden> searchKunden(String kundenName){
		
		Vector<Kunden> kunden = new Vector<Kunden>();
		String query = "SELECT K FROM Kunden K WHERE K.name LIKE :name";
		
		Query q = em.createQuery(query);
	
		q.setParameter("name","%"+ kundenName +"%");
		kunden = (Vector<Kunden>) q.getResultList(); 
		
		
	
		return kunden;
	}
	
	
	@SuppressWarnings("unchecked")
	public Vector<Reservierung> searchReservierung(int zimmerId){
		
		Vector<Reservierung> reservierungen = new Vector<Reservierung>();
		String query = "SELECT R FROM Reservierung R WHERE R.zimmer.id = :zimmerId";
		
		Query q = em.createQuery(query);
	
		q.setParameter("zimmerId", zimmerId);
		reservierungen = (Vector<Reservierung>) q.getResultList(); 
		
		
	
		return reservierungen;
	}
	
	
	public Kunden getKunde(int id){
		Kunden kunde = new Kunden();
		kunde = em.find(Kunden.class, id);
		return kunde;
		
		
	}
	
	public Zimmer getZimmer(int id){
		Zimmer zimmer = new Zimmer();
		zimmer = em.find(Zimmer.class, id);
		return zimmer;
		
		
	}
	
	
	public boolean editGuest(Kunden kunde){
		try{
			em.merge(kunde);
			return true;
		}catch(Exception e){
			
			err = "Exception: " + e.getMessage();
			return false;
		}
	}
	
	
	public boolean editZimmerSave(Zimmer zimmer){
		try{
			em.merge(zimmer);
			return true;
		}catch(Exception e){
			
			err = "Exception: " + e.getMessage();
			return false;
		}
	}
	
	
	public boolean removeZimmerSave(Zimmer z){
		try{
			
			Zimmer zimmer = em.merge(z);
			
			em.remove(zimmer);
			return true;
		}catch(Exception e){
			
			err = "Exception: " + e.getMessage();
			return false;
		}
	}
	
	public boolean saveReservation(Reservierung reservierung){
		try{
				em.persist(reservierung);
			
			
			return true;
		}catch(Exception ex){
			err = "Exception: " + ex.getMessage();
			return false;
		}
	}
		
	public List<Zimmer> getAvailableZimmer(int zahl){
		List<Zimmer> lstZimmer = new ArrayList<Zimmer>();
		List<Zimmer> lstZimmerWitMaxBeleg = new ArrayList<Zimmer>(); 
		
		
		lstZimmerWitMaxBeleg = getSpecificZimmer(zahl);
				
		if(lstZimmerWitMaxBeleg != null){
			lstZimmer = lstZimmerWitMaxBeleg;
		}else{
			lstZimmer = null;
		}
		
		
		return lstZimmer;
	}
	
	private List<Zimmer> getSpecificZimmer(int zahl){
		List<Zimmer> lstZimmer = new ArrayList<Zimmer>();
		String query = "SELECT Z FROM Zimmer Z WHERE Z.maxBelegZahl = :maxZahl";
		

		Query q = em.createQuery(query);
		q.setParameter("maxZahl", zahl );
		lstZimmer = q.getResultList(); 
		
		
		if(lstZimmer.size() > 0){
			
		}else{
			lstZimmer = null;
		}
		return lstZimmer;
	}
	public boolean saveReservation(Kunden kunde, Reservierung reservierung, Zimmer zimmer){
		try{
		
			em.persist(reservierung);
			
			
			return true;
			
		}catch(Exception ex){
			err = "Exception: " + ex.getMessage();
			return false;
		}
	}
	
	public boolean removeReservatin(Reservierung reservierung){
		boolean _return = false;
		
		try{
			Reservierung r = em.merge(reservierung);
			em.remove(r);
			_return = true;
		}catch(Exception e){
			err = "Exception: removeReservatin() --> "+ e.getMessage();
		}
		
		return _return;
	}
	
	
	public String testReservation(Date reservierungBis, int maxZahl){
		String _return = "";
		List<Reservierung> lstReservierungen = new ArrayList<Reservierung>();
		//String query = "SELECT R.id, R.zimmer.id, R.kunden.id, Z.id, R.reservierungVon FROM Reservierung R, Zimmer Z " +
		String query = "SELECT R FROM Reservierung R, Zimmer Z " +
					   "WHERE Z.maxBelegZahl = :maxZahl " +
					   "AND R.zimmer.id = Z.id " +
					   "AND R.reservierungBis >= :reservierungBis";
					   
					   
		Query q = em.createQuery(query);
		q.setParameter("maxZahl", maxZahl );
		q.setParameter("reservierungBis", reservierungBis );
		lstReservierungen = q.getResultList(); 		
		
		if(lstReservierungen.size() > 0){
			
			for(Reservierung r : lstReservierungen){
				_return +="Reservation id: "+ r.getId();
				_return += ", Kunden Id: "+ r.getKunden().getId();
				_return += ", Zimmer Id: "+ r.getZimmer().getId();
				_return += ", Date von: "+ r.getReservierungVon();
				_return += ", Date bis: "+ r.getReservierungBis();
				_return +="<br><br>";
			}
			
		}else{
			_return = "No reservation found!";
		}
		return _return;
	}
	
	public String getErr() {
		return err;
	}

	public void setErr(String err) {
		this.err = err;
	}
	
	
	
}
